#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;

//简易string实现
class String
{
public:
  String(const char* str = "") :_str(new char[strlen(str) + 1])
  {
    cout <<R"(String(const char* str = ""))" << endl;
    strcpy(_str,str);
  }
  //String(const String& s):_str(new char[strlen(s._str) + 1])
  //{
  //  cout <<"String(const String& s)" << endl;
  //  strcpy(_str,s._str);
  //}
  
  String(const String& s) :_str(nullptr)
  {
    String tmp(s._str); //复用构造函数
    Swap(tmp);
  }
  void Swap(String& s)
  {
    ::swap(_str,s._str); 
  }
  //如果此处用的是传值,会和下面的String& operator=(String&& s)冲突,当使用s3 = move(s1)的时候不知道使用的是哪个函数
  String& operator=(String& s) 
  {
    if(this != &s)
    {
      this->~String();
      String tmp(s._str);
      Swap(tmp);
    }
    return *this;
  }
  //String& operator=(const String& s)
  //{
  //  cout <<"String& operator=(const String& s)" << endl;
  //  if(this != &s)
  //  {
  //    this->~String();
  //    _str = new char[strlen(s._str)+1];
  //    strcpy(_str,s._str);
  //  }
  //  return *this;
  //}
  String(String&& s) :_str(nullptr)
  {
    cout <<"String(String&& s)" << endl;
    ::swap(_str,s._str);
  }
  String& operator=(String&& s)
  {
    cout <<"String& operator=(String&& s)" << endl;
    if(this != &s)
    {
      this->~String();
      ::swap(_str,s._str);
    }
    return *this;
  }
  const char* c_str()
  {
    return _str;
  }
  ~String()
  {
    if(_str) delete[] _str;
    _str = nullptr;
  }
private:
  char* _str;
};
int main()
{
  String s1("hello world");
  String s2 = s1;
  String s3;
  s3 = s1;

  cout <<"-------------------" << endl;
  s3 = move(s2);
  String s4 = move(s3);
  return 0;
}
